package com.coderman.infosys.auth.api.facade.user;

import com.coderman.infosys.auth.api.dto.user.UserGroupDTO;
import com.coderman.infosys.auth.api.dto.user.request.UpdateUserGroupRequestDTO;
import com.coderman.infosys.auth.api.dto.user.request.CreateUserGroupRequestDTO;
import com.coderman.infosys.plat.auth.common.dto.ResultDataDto;


/**
* @Description:接口
* @Author:
* @CreateTime:2022-01-02 15:27:39
* @version v1.0
*/
public interface UserGroupFacade{

	/**
	 *
	 * @Description 创建用户组
	 * @param createUserGroupRequestDTO
	 * @return UserGroupDTO
	 * 这里假设创建用户组的流程如下
	 * 1.可以只创建用户组名和关联部分用户
	 * 2.创建的同时用户组关联角色
	 * 3.创建的同时用户组关联角色组
	 * 4.创建完成之后给用户发送通知如：你被xxx加入xxx用户组
	 * 5.创建完成之后更新用户组和角色-用户缓存缓存
	 * 6.一个用户组最多关联50位用户
	 * 7.todo 一个用户最多关联5个用户组,否则提示创建失败
	 * 我个人对于cmd的这种对象的用法理解是cmd用于业务场景比较重且流程比较长的场景，通过cmd可以在应用层串联多个业务流程
	 * 比如上面的流程如果说用户组关联角色组需要走一个申请流程才可以关联，那么就可以通过cmd-event-msg来加入整体流程，此时的业务相对于传统的service服务面条式的或者
	 * 过程式的代码会显得更加容易维护和理解
	 * 比如，后面需求变了，用户组创建增加一种类型是临时的，带有有效期的，这种的逻辑会变得更加复杂
	 *
	 */
	ResultDataDto<UserGroupDTO> createUserGroup(CreateUserGroupRequestDTO createUserGroupRequestDTO);

	/**
	 *
	 * @Description 修改用户组信息
	 * @param updateUserGroupRequestDTO
	 * @return Boolean
	 */
	ResultDataDto<Boolean> updateUserGroup(UpdateUserGroupRequestDTO updateUserGroupRequestDTO);

	/**
	 *
	 * @Description 设置用户组状态
	 * @param groupCode
	 * @param status
	 * @return Boolean
	 */
	ResultDataDto<Boolean> updateUserGroupStatus(String groupCode, Integer status);
}